﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Windows.Forms;

namespace AvaProvi
{
    [Serializable]
    public class clsSuperficieAccesoria_CRN:clsEstado,IControlEstados
    {
        #region Propiedades de clase
        public int Numero { get; set; }
        public string Descripcion { get; set; }
        public double SuperficieM2 { get; set; }
        public double VRNm2 { get; set; }
        public double Demerito { get; set; }
        public int IDSuperficie { get; set; }
        public clsTerreno_CRN Terreno { get; set; }
        public double ValorAsegurable
        {
            get
            {
                return this.VRNm2 * this.SuperficieM2 * 0.85;
            }
        }
        public double VNRm2
        {
            get
            {
                return (1 - this.Demerito) * this.VRNm2;
            }
        }
        public double ValorParcial
        {
            get
            {
                return this.VNRm2 * this.SuperficieM2;
            }
        }
        #endregion 

        #region Constructor
        public clsSuperficieAccesoria_CRN(clsTerreno_CRN objTerreno):base()
        {
            this.Demerito = 0;
            this.Descripcion = string.Empty;
            this.Terreno = objTerreno;
        }
        #endregion

        #region Métodos

        public bool Guardar()
        {
            if (this.DatosValidos())
            {
                if (this.EsNuevo)
                    return CreaSuperficieAccesoria();
                else
                {
                    if (this.EsModificado)
                        return ModificaSuperficieAccesoria();
                    else
                        return EliminaSuperficeAccesoria();
                }
            }
            return false;
        }

        private bool EliminaSuperficeAccesoria()
        {
            clsSuperficieAccesoria_CD objSuperficieAccesoria_CD = new clsSuperficieAccesoria_CD();
            return objSuperficieAccesoria_CD.EliminaSuperficeAccesoria(this);
        }

        private bool ModificaSuperficieAccesoria()
        {
            clsSuperficieAccesoria_CD objSuperficieAccesoria_CD = new clsSuperficieAccesoria_CD();
            return objSuperficieAccesoria_CD.ActualizaSuperficeAccesoria(this);
        }

        private bool CreaSuperficieAccesoria()
        {
            clsSuperficieAccesoria_CD objSuperficieAccesoria_CD = new clsSuperficieAccesoria_CD();
            return objSuperficieAccesoria_CD.CreaSuperficeAccesoria(this);
        }

        public bool DatosValidos()
        {
            if ((this.Numero == 0) && (this.Descripcion.Length == 0) && (this.SuperficieM2 == 0))
            {
                this.EsEliminado = true;
                return true;
            }
            if (this.Numero == 0)
            {
                MessageBox.Show("El número de la superficie debe ser mayor a cero.\nNo se guardarán los cambios hasta que corrija la información.", "Dato inválido", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (this.Descripcion.Length == 0)
            {
                MessageBox.Show("Debe escribir la descripción de la superficie.\nNo se guardarán los cambios hasta que corrija la información.", "Dato inválido", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }

            if (this.SuperficieM2 == 0)
            {
                MessageBox.Show("La superficie debe ser mayor a cero.\nNo se guardarán los cambios hasta que corrija la información.", "Dato inválido", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

        public static BindingList<clsSuperficieAccesoria_CRN> RecuperaSuperficiesAccesoriasDeTerreno(clsTerreno_CRN objTerreno)
        {
            clsSuperficieAccesoria_CD objSuperficieAccesoria_CD = new clsSuperficieAccesoria_CD();
            BindingList<clsSuperficieAccesoria_CRN> blSuperficies = new BindingList<clsSuperficieAccesoria_CRN>();
            BindingList<dsTerreno.SuperficieAccesoriaRow> blSuperficiesRecuperadas = objSuperficieAccesoria_CD.RecuperSuperficiesAccesoriasDeTerreno(objTerreno.Inmueble.Avaluo.IdAvaluo);
            foreach (dsTerreno.SuperficieAccesoriaRow filaSuperficie in blSuperficiesRecuperadas)
            {
                clsSuperficieAccesoria_CRN objSuperficie = new clsSuperficieAccesoria_CRN(objTerreno);
                objSuperficie.Demerito = filaSuperficie.Demerito;
                objSuperficie.Descripcion = filaSuperficie.Descripcion;
                objSuperficie.EsModificado = true;
                objSuperficie.IDSuperficie = filaSuperficie.IDSuperficie;
                objSuperficie.Numero = filaSuperficie.Numero;
                objSuperficie.SuperficieM2 = filaSuperficie.SuperficieM2;
                objSuperficie.VRNm2 = filaSuperficie.VRNm2;
                blSuperficies.Add(objSuperficie);
            }
            return blSuperficies;
        }
        #endregion
    }
}
